#include <stdio.h>

void main()
{
    // 指针移动的单位，与指针指向的数据类型有关。数据类型占据多少个字节，每单位就移动多少个字节
    int num = 1; // int 类型通常占4个字节
    int *p = &num;
    printf("%p\n", p);
    p += 1; // p向后移动1个int类型的单位，即4个字节
    printf("%p\n", p);
    printf("%i\n", *p); // 未定义行为，访问了未分配的内存

    printf("-------------------------------\n");
    // 数组是连续存储的，数组名其实就是数组第一个元素的地址的指针
    int arr[] = {1, 2, 3, 4, 5};
    printf("%p\n", arr); // 数组名arr表示数组第一个元素的地址
    // 这里的 + 1 表示向后移动一个int类型的单位，即4个字节
    printf("%p\n", arr + 1);    // arr + 1表示数组第二个元素的地址
    printf("%d\n", *(arr + 1)); // 解引用访问数组第二个元素的值

    // 相同类型的指针允许进行减法运算，返回它们之间的距离，即相隔多少个数据单位
    printf("%ld", (arr + 1) - arr); // 连个地址相距一个int单位
}